package controllers

import (
	"chuanyou444/models"
	"encoding/json"
	"errors"
	"strconv"
	"strings"

	beego "github.com/beego/beego/v2/server/web"
)

// ClassmatesController operations for Classmates
type ClassmatesController struct {
	beego.Controller
}

// URLMapping ...
func (c *ClassmatesController) URLMapping() {
	c.Mapping("Post", c.Post)
	c.Mapping("GetOne", c.GetOne)
	c.Mapping("GetAll", c.GetAll)
	c.Mapping("Put", c.Put)
	c.Mapping("Delete", c.Delete)
}

// Post ...
// @Title Post
// @Description create Classmates
// @Param	body		body 	models.Classmates	true		"body for Classmates content"
// @Success 201 {int} models.Classmates
// @Failure 403 body is empty
// @router / [post]
func (c *ClassmatesController) Post() {
	var v models.Classmates
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
		if _, err := models.AddClassmates(&v); err == nil {
			c.Ctx.Output.SetStatus(201)
			c.Data["json"] = v
		} else {
			c.Data["json"] = err.Error()
		}
	} else {
		c.Data["json"] = err.Error()
	}
	c.ServeJSON()
}

// GetOne ...
// @Title Get One
// @Description get Classmates by id
// @Param	id		path 	string	true		"The key for staticblock"
// @Success 200 {object} models.Classmates
// @Failure 403 :id is empty
// @router /:id [get]
func (c *ClassmatesController) GetOne() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	v, err := models.GetClassmatesById(id)
	if err != nil {
		c.Data["json"] = err.Error()
	} else {
		c.Data["json"] = v
	}
	c.ServeJSON()
}

// GetAll ...
// @Title Get All
// @Description get Classmates
// @Param	query	query	string	false	"Filter. e.g. col1:v1,col2:v2 ..."
// @Param	fields	query	string	false	"Fields returned. e.g. col1,col2 ..."
// @Param	sortby	query	string	false	"Sorted-by fields. e.g. col1,col2 ..."
// @Param	order	query	string	false	"Order corresponding to each sortby field, if single value, apply to all sortby fields. e.g. desc,asc ..."
// @Param	limit	query	string	false	"Limit the size of result set. Must be an integer"
// @Param	offset	query	string	false	"Start position of result set. Must be an integer"
// @Success 200 {object} models.Classmates
// @Failure 403
// @router / [get]
func (c *ClassmatesController) GetAll() {
	var fields []string
	var sortby []string
	var order []string
	var query = make(map[string]string)
	var limit int64 = 10
	var offset int64

	// fields: col1,col2,entity.col3
	if v := c.GetString("fields"); v != "" {
		fields = strings.Split(v, ",")
	}
	// limit: 10 (default is 10)
	if v, err := c.GetInt64("limit"); err == nil {
		limit = v
	}
	// offset: 0 (default is 0)
	if v, err := c.GetInt64("offset"); err == nil {
		offset = v
	}
	// sortby: col1,col2
	if v := c.GetString("sortby"); v != "" {
		sortby = strings.Split(v, ",")
	}
	// order: desc,asc
	if v := c.GetString("order"); v != "" {
		order = strings.Split(v, ",")
	}
	// query: k:v,k:v
	if v := c.GetString("query"); v != "" {
		for _, cond := range strings.Split(v, ",") {
			kv := strings.SplitN(cond, ":", 2)
			if len(kv) != 2 {
				c.Data["json"] = errors.New("Error: invalid query key/value pair")
				c.ServeJSON()
				return
			}
			k, v := kv[0], kv[1]
			query[k] = v
		}
	}

	l, err := models.GetAllClassmates(query, fields, sortby, order, offset, limit)
	if err != nil {
		c.Data["json"] = err.Error()
	} else {
		c.Data["json"] = l
	}
	c.ServeJSON()
}

// Put ...
// @Title Put
// @Description update the Classmates
// @Param	id		path 	string	true		"The id you want to update"
// @Param	body		body 	models.Classmates	true		"body for Classmates content"
// @Success 200 {object} models.Classmates
// @Failure 403 :id is not int
// @router /:id [put]
func (c *ClassmatesController) Put() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	v := models.Classmates{Id: id}
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
		if err := models.UpdateClassmatesById(&v); err == nil {
			c.Data["json"] = "OK"
		} else {
			c.Data["json"] = err.Error()
		}
	} else {
		c.Data["json"] = err.Error()
	}
	c.ServeJSON()
}

// Delete ...
// @Title Delete
// @Description delete the Classmates
// @Param	id		path 	string	true		"The id you want to delete"
// @Success 200 {string} delete success!
// @Failure 403 id is empty
// @router /:id [delete]
func (c *ClassmatesController) Delete() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	var export models.Export
	if code, err := models.DeleteClassmates(id); err == nil {
		export.Code = code
		if code == 1000 {
			export.Message = "删除成功"
		} else {
			export.Message = err.Error()
		}
		c.Data["json"] = export
	} else {
		export.Code = code
		export.Message = err.Error()
		c.Data["json"] = export
	}
	c.ServeJSON()
	// if err := models.DeleteClassmates(id); err == nil {
	// 	c.Data["json"] = "OK"
	// } else {
	// 	c.Data["json"] = err.Error()
	// }
	// c.ServeJSON()
}

// 登陆 ...
// @Title 登陆
// @Description 学生登陆
// @Param	sn		query 	string	true		"学号"
// @Param	pswd    query 	string	true		"密码"
// @Success 200 {string} get success!
// @Failure 403 id is empty
// @router /yanzhengLogin [get]
func (c *ClassmatesController) YanZhengLogin() {
	var sn = c.GetString("sn")
	var pswd = c.GetString("pswd")

	result, err := models.Login(sn, pswd)
	var export models.Export
	if result == nil {
		export.Code = 1001
		export.Message = err.Error()
	} else {
		export.Code = 1000
		export.Message = "登陆成功"
		export.Data = result
	}

	c.Data["json"] = export
	c.ServeJSON()
}

// 测试 ...
// @Title 测试
// @Description 测试
// @Param	sn		query 	string	true		"学号"
// @Param	pswd    query 	string	true		"密码"
// @Success 200 {string} get success!
// @Failure 403 id is empty
// @router /Ceshi [get]
func (c *ClassmatesController) Ceshi() {
	var sn = c.GetString("sn")
	var pswd = c.GetString("pswd")

	result := models.Ceshi(sn, pswd)

	c.Data["json"] = result
	c.ServeJSON()
}

// 改密码 ...
// @Title 改密码
// @Description 改密码
// @Param	userid		query 	int	true		"用户id"
// @Param	oldpswd     query 	string	true		"老密码"
// @Param	newpswd     query 	string	true		"新密码"
// @Success 200 {string} get success!
// @Failure 403 id is empty
// @router /updatepswd [get]
func (c *ClassmatesController) UpdatePswd() {
	var oldpswd = c.GetString("oldpswd")
	var newpswd = c.GetString("newpswd")
	var userid, _ = c.GetInt("userid")

	result := models.Updatepswd(userid, oldpswd, newpswd)
	if result == false {
		c.Data["json"] = "密码改失败了"
		c.ServeJSON()
		return
	}

	c.Data["json"] = "密码改成功了"
	c.ServeJSON()
}
